﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VirtualOverrideAnlama2
{
    class Anasinif
    {
        public Anasinif()
        {
            IslemYap();
        }
        public virtual void IslemYap()
        {
            Console.WriteLine("Anasinif islem yapar");
        }
    }
    class Tureyen:Anasinif
    {
        //public Tureyen()
        //{
        //    //Bu Tureyen nesnesi new ile olusturuldugunda, Anasinif nesnesi de olusur
            
        //    IslemYap(); //peki ayni isimdeki metod icin derleyici hangi classin metodunu secer? bence Anasinifin cunku once o nesne olusturulmustur
        //                //daha Tureyen sinif nesnesi olusmadan derleyici Anasinif nesnesinde daha once olusan metodu alir! :) HAYIR
        //                //boyle olsaydi buyuk bir bug olurdu!
        //                //cunku IslemYap() i Anasinifin ctoruna yazarsam. Once Anasinif objesi olusacagindan ve hemen IslemYap() metodu cagiracagindan
                          //derleyiciye tureyen sinifin IslemYap() metodunu cagirmasini soyleyemiyecektim ve bunu derleyicide bilemiyecekti.
                          //ama Anasiniftaki metoda virtual deyip TureyenSiniftakine override dersem derleyiciye kimin once cagrilacagini bildirmis 
                          //olurdum
                          //ama tabikide Anasiniftaki metodu cagiracaksak illa, anasinif ctoruna cagiracagimiz metodu yazardik, tureyen sinif
                          //olustugunda once o metod cagrilirdi
        //}
        public override void IslemYap()
        {
            Console.WriteLine("Tureyen Sinif islem yapar");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Tureyen s = new Tureyen();
            /*
             output: Tureyen Sinif islem yapar
             */

        }
    }
}
